const http = require('http');
const path = require('path');
const multiparty = require('multiparty');
const fse = require('fs-extra');

const server = http.createServer();
// 所有上传文件的保存位置
const UPLOAD_DIR = path.resolve(__dirname, '.', 'target');

server.on('request', async (req, res) => {
  res.setHeader('Access-Control-Allow-Origin', '*');
  res.setHeader('Access-Control-Allow-Header', 'Access-Control-Request-Headers');

  if (req.url == '/') {
    // 针对文件上传的包  https://www.npmjs.com/package/multiparty
    const myMultiparty = new multiparty.Form();
    myMultiparty.parse(req, async (err, fields, files) => {
      if (err) return;
      // console.log(fields);
      // 拿到传递过来的文件名，和具体的文件chunk内容, 参数名是前端FormData里面append定义的字段
      const [fileName] = fields.fileName;
      const [chunk] = files.chunk;
      // console.log(fileName, chunk);

      // 每个图片有多个切片，将当前图片的所有切片保存在一个文件夹里,当前所有切片的文件夹名称为文件名取前面部分
      // file-0  file-1  file-2  那么当前切片保存的文件夹名称就是  file， 新建这个文件夹
      const slice_dir_name = fileName.split('-')[0];
      const chunkDirPath = path.resolve(UPLOAD_DIR, '.', slice_dir_name);
      // console.log(11, chunkDirPath);

      // 这个请求执行多次，要判断当前切片目录是否存在，确保该目录只能创建一次
      if (!fse.existsSync(chunkDirPath)) {
        // 异步方法 返回primsie,  耗时任务 await防止阻塞程序，
        await fse.mkdirs(chunkDirPath);
      }

      // 然后就是将接收到的切片移动到对应的切片目录， 参数为两个路径，第三个参数overwrite，确保重复上传同名切片，就覆盖之前的
      await fse.move(chunk.path, `${chunkDirPath}/${fileName}`, { overwrite: true });
      res.end('ok');
    });
  }
});

server.listen(3000);
